#ifndef __M_MANAGER_H__
#define __M_MANAGER_H__

/*
    日志器管理类：
    1. 对所有创建的日志起进行管理
    2. 可以在程序任意位置，获取相同单例对象，获取其中的日志起进行日志输出
    3. 设计默认日志器，让用户在不创建任何日志起情况下也能进行标准输出打印，方便用户使用
*/

#include <mutex>
#include <memory>
#include <string>
#include <unordered_map>
#include "logger.hpp"

namespace MyLog
{
    class LoggerManager
    {
    private:
        LoggerManager() 
        {
            //构建默认日志器
            LocalLoggerBuilder builder;
            builder.buildLoggerName("RootLogger");
            _rootLogger = builder.build();
            _loggersManager.insert({"RootLogger", _rootLogger});
        }
        LoggerManager(const LoggerManager&) = delete;
        ~LoggerManager() {}; 

    public:
        static LoggerManager& GetInstance()
        {
           static LoggerManager _eton;
           return _eton;
        }

    public:
        bool AddLogger(Logger::ptr& logger)
        {
            if(JudgeLogger(logger->GetLoggerName()))
                return false;
            _loggersManager.insert({logger->GetLoggerName(), logger});
            return true;
        }

        bool JudgeLogger(const std::string& name)
        {
            if(_loggersManager.count(name))
                return true;
            return false;
        }

        Logger::ptr GetLogger(const std::string& name)
        {
            if(!JudgeLogger(name))
                return nullptr;
            return _loggersManager[name];
        }

        Logger::ptr RootLogger()
        {
            return _rootLogger;
        }

    private:
        std::mutex _mutex;
        Logger::ptr _rootLogger;
        std::unordered_map<std::string, Logger::ptr>  _loggersManager;
    };
}

#endif